package compilador.ts;

import java.util.ArrayList;

import compilador.Token;

/**
 * 
 * @author Juan Luis Martinez
 *
 */
public class TablaSimbolos {

	ArrayList<EntradaTS> ts;

	public static final int NOESTA = -1;

	/**
	 * Constructor
	 */
	public TablaSimbolos() {
		ts = new ArrayList<EntradaTS>();
		insertarPalabrasReservadas();
	}

	/**
	 * Introduce las palabras reservadas en la tabla de simbolos
	 * al crear la tabla
	 */
	public void insertarPalabrasReservadas() {

		//TODO meter todas las entradas, y revisar que poner en el tipo
		ts.add(new EntradaTS(Token.AND, "and", -1, -1));
		ts.add(new EntradaTS(Token.RES_BOOLEANO, "booleano", -1, -1));
		ts.add(new EntradaTS(Token.RES_BOOLEANO, "booleano", -1, -1));
		ts.add(new EntradaTS(Token.RES_BOOLEANO, "booleano", -1, -1));
		ts.add(new EntradaTS(Token.RES_BOOLEANO, "booleano", -1, -1));
		ts.add(new EntradaTS(Token.RES_BOOLEANO, "booleano", -1, -1));
		ts.add(new EntradaTS(Token.RES_BOOLEANO, "booleano", -1, -1));
	}

	/**
	 * Devuelve el lexema de una posicion concreta de la tabla de simbolos
	 * 
	 * @param index indice de la tabla de simbolos
	 * @return String - null si no existe esa posicion en la tabla
	 *                - el lexema en caso contrario
	 */
	public String getLexema(int index) {
		String lex;
		try {
			lex = ts.get(index).getLexema();
		} catch (IndexOutOfBoundsException e) {
			lex = null;
		}

		return lex;
	}

	/**
	 *  Inserta un elemento nuevo a la tabla
	 *  sido insertado.

	 */
	public void insertar(EntradaTS e) {
		ts.add(e);
	}

	/**
	 *  Busca un elemento en la tabla de simbolos y devuelve la posicion en la
	 *  que se encuentra.
	 *  
	 * @param lexema - el elemento a reconocer
	 * @return -1 si el elemento no esta, la posicion en cualquier otro caso
	 */
	public int buscar(String lexema) {
		int pos = NOESTA;

		for (EntradaTS e : ts) {
			if (e.getLexema().equals(lexema)) {
				pos = ts.indexOf(e);
				break;
			}
		}

		return pos;
	}

	/**	
	 * @see compilador.ts.buscar(String lexema)
	 */
	public int getIndex(String o) {
		return buscar(o);
	}

	public EntradaTS get(int index) {
		return ts.get(index);
	}
}
